<?php

class DevolucionsController extends AppController {

    var $name = 'Devolucions';
    var $uses = array('Devolucion', 'DevolucionDetalle', 'Cliente', 'Material', 'Lapso', 'Cliente', 'TiendaLocal', 'Usuario');
    var $components = array('Vista', 'Maestro', 'Interfaz');
    var $helpers = array('Interfaz', 'Paginator', 'Formulario');
    var $layout = "ajax";
    var $paginate = array('limit' => 10, 'order' => array('Devolucion.id' => 'DESC'));

    public function beforeFilter() {
        $this->validar_sesion();
    }

    public function afterFilter() {
        $this->auditoria();
    }

    public function index($busqueda = null) {
        extract($this->request->data);
        $data = null;
        $idCliente = null;
        $condiciones = array();
        $condicionesModelo = array();
        $condicionesCliente = array();
        $condiciones['Devolucion.estatus !='] = 0;
        
        if (!empty($fechaInicio))
            $condiciones['DATE(Devolucion.fecha) BETWEEN ? AND ?'] = array($fechaInicio, $fechaFin);
        
        if (!empty($busqueda)) {
            $condicionesModelo['Devolucion.numero ILIKE'] = "%$busqueda%";
            $idCliente = $this->Cliente->buscar_clientes($busqueda);
            if (!empty($idCliente))
                $condicionesCliente['Devolucion.cliente_id'] = $idCliente;
        } else {
            if(!empty($punto_id))
                $condiciones['Devolucion.punto_id'] = $punto_id;
        }
        
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objDev = $this->Maestro->modelo('punto', 'Devolucion', $tiendaSesion);
        $data = $this->paginate($objDev, array($condiciones, 'OR' => array($condicionesModelo, $condicionesCliente)));

        $this->set('url', $busqueda);
        $this->set('data', $data);
    }

    public function historial() {
        extract($this->request->data);
        $data = null;
        $condiciones['DATE(Devolucion.fecha)'] = date('Y-m-d');
        
        if(!empty($punto_id))
            $condiciones['Devolucion.punto_id'] = $punto_id;
        
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objDev = $this->Maestro->modelo('punto', 'Devolucion', $tiendaSesion);
        $data = $this->paginate($objDev, array($condiciones));

        $this->set('data', $data);
    }

    public function detalle() {
        extract($this->request->data);
        $id = $this->Interfaz->id($id);
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objFact = $this->Maestro->modelo('punto', 'Devolucion', $tiendaSesion);
        $data = $objFact->find('first', array('conditions' => array('Devolucion.id' => $id)));
        list($fecha) = explode(' ', $data['Devolucion']['fecha']);
        $fechaInvertida = implode('-', array_reverse(explode('-', $fecha)));
        $productos = $objFact->query("select * FROM fnc_obtener_existencia_material_venta($id, '" . $fechaInvertida . "', 'D')");
        $resultadoFlete = $objFact->find('first', array('fields' => array('Devolucion.id', 'Devolucion.numero', 'Devolucion.numero_control'), 'conditions' => array('Devolucion.padre_id' => $id)));

        if (!empty($resultadoFlete))
            $flete = $objFact->query("select * FROM fnc_obtener_existencia_material_venta({$resultadoFlete['Devolucion']['id']}, '$fechaInvertida', 'D')");
        else
            $flete = null;

        $idFlete = $codigoFlete = $controlFlete = null;

        if (!empty($resultadoFlete)) {
            $codigoFlete = $resultadoFlete['Devolucion']['numero'];
            $controlFlete = $resultadoFlete['Devolucion']['numero_control'];
            $idFlete = $resultadoFlete['Devolucion']['id'];
        }

        $datosUsuario = $this->Usuario->find('first', array('fields' => 'Usuario.usuario', 'conditions' => array('Usuario.id' => $data['Devolucion']['usuario_id'])));


        $this->set('usuario', $datosUsuario['Usuario']['usuario']);

        $this->set('url', $id);
        $this->set('data', $data);
        $this->set('productos', $productos);
        $this->set('tienda', $tiendaSesion);
        $this->set('flete', $flete);
        $this->set('codigoFlete', $codigoFlete);
        $this->set('controlFlete', $controlFlete);
        $this->set('idFlete', $idFlete);
        $this->set('resultadoFlete', $resultadoFlete);
    }

    public function logs() {
        extract($this->request->data);
        $idDev = $this->Interfaz->id($idDev);
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objDev = $this->Maestro->modelo('punto', 'Devolucion', $tiendaSesion);

        $logDevoluciones = $objDev->query("SELECT * FROM fnc_log_documento($idDev,'DEV') AS (id integer,documento character varying,fecha timestamp without time zone,tipo integer,descripcion character varying);");

        $this->set('log', $logDevoluciones);
    }

    public function guardar() {
        if ($this->validar_cierre()) {
            extract($this->request->data);
            $idFac = $this->Interfaz->id($idFac);
            $productos = json_decode($productos, true);
            $cantidades = json_decode($cantidades, true);
            $nuevoID = str_replace('-', '', $num_form);
            $fecha = "fecha_$nuevoID";
            $fechaFinal = $$fecha;
            $lapso_id = (!empty($lapso_id)) ? $lapso_id : 1;
            $devolucion['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
            $devolucion['cliente_id'] = $this->Interfaz->id($this->request->data['id2']);
            $devolucion['usuario_id'] = $this->Interfaz->id($this->Session->read('usuario_id'));
            $devolucion['punto_id'] = $this->Session->read('punto_id');
            $devolucion['factura_id'] = $idFac;
            $devolucion['numero'] = '001';
            $devolucion['observacion'] = $this->Interfaz->mayuscula($observacion);
            $devolucion['fecha'] = 'now()';
            $devolucion['monto'] = $monto;
            $devolucion['tipdev'] = 'N';
            $tipo_cliente_id = (isset($tipo_cliente_id) && !empty($tipo_cliente_id)) ? $tipo_cliente_id : 1;

            $tiendaSesion = $this->Session->read('tiendaBD');
            $objDev = $this->Maestro->modelo('punto', 'Devolucion', $tiendaSesion);
            $objDevDet = $this->Maestro->modelo('punto', 'DevolucionDetalle', $tiendaSesion);
            $objFact = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
            $objFacDet = $this->Maestro->modelo('punto', 'FacturacionDetalle', $tiendaSesion);
            $facturas = $objFact->find('all', array('fields' => 'Facturacion.id', 'conditions' => array('OR' => array('Facturacion.id' => $idFac, 'Facturacion.padre_id' => $idFac)), 'order' => array('Facturacion.id')));
            $detalleFactura = $objFacDet->find('all', array('fields' => 'FacturacionDetalle.material_id, FacturacionDetalle.cantidad, FacturacionDetalle.precio, FacturacionDetalle.impuesto', 'conditions' => array('FacturacionDetalle.factura_id' => $idFac)));
            if (isset($facturas[1])) {
                $idFle = $facturas[1]['Facturacion']['id'];
                $detalleFactura = $objFacDet->find('all', array('fields' => 'FacturacionDetalle.material_id, FacturacionDetalle.cantidad, FacturacionDetalle.precio, FacturacionDetalle.impuesto', 'conditions' => array('FacturacionDetalle.factura_id' => array($idFac, $idFle))));
            }
            $objDev->query('BEGIN WORK');
            if ($objDev->save($devolucion)) {
                $totalServicios = $conServicios = 0;
                $devolucionDetalle = $detalleServicios = $servicios = array();
                $datoServicios = $this->Material->find('all', array('fields' => array('Material.id'), 'conditions' => array('Material.tipoarticulos_id' => 2)));
                foreach ($datoServicios as $datSer) {
                    $servicios[] = $datSer['Material']['id'];
                }
                foreach ($detalleFactura as $indice => $valor) {
                    if (in_array($valor['FacturacionDetalle']['material_id'], $productos)) {
                        $idPro = array_search($valor['FacturacionDetalle']['material_id'], $productos);
                        if (in_array($valor['FacturacionDetalle']['material_id'], $servicios)) {
                            $totalServicios += ($cantidades[$idPro] * $valor['FacturacionDetalle']['precio']) + round((($cantidades[$idPro] * $valor['FacturacionDetalle']['precio']) * $valor['FacturacionDetalle']['impuesto']) / 100, 2);
                            $detalleServicios[$conServicios]['DevolucionDetalle']['material_id'] = $valor['FacturacionDetalle']['material_id'];
                            $detalleServicios[$conServicios]['DevolucionDetalle']['usuario_id'] = $devolucion['usuario_id'];
                            $detalleServicios[$conServicios]['DevolucionDetalle']['almacen_id'] = 1;
                            $detalleServicios[$conServicios]['DevolucionDetalle']['cantidad'] = $cantidades[$idPro];
                            $detalleServicios[$conServicios]['DevolucionDetalle']['precio'] = $valor['FacturacionDetalle']['precio'];
                            $detalleServicios[$conServicios]['DevolucionDetalle']['impuesto'] = $valor['FacturacionDetalle']['impuesto'];
                            $conServicios++;
                        } else {
                            $devolucionDetalle[$indice]['DevolucionDetalle']['devolucion_id'] = $objDev->id;
                            $devolucionDetalle[$indice]['DevolucionDetalle']['material_id'] = $valor['FacturacionDetalle']['material_id'];
                            $devolucionDetalle[$indice]['DevolucionDetalle']['usuario_id'] = $devolucion['usuario_id'];
                            $devolucionDetalle[$indice]['DevolucionDetalle']['almacen_id'] = 1;
                            $devolucionDetalle[$indice]['DevolucionDetalle']['cantidad'] = $cantidades[$idPro];
                            $devolucionDetalle[$indice]['DevolucionDetalle']['precio'] = $valor['FacturacionDetalle']['precio'];
                            $devolucionDetalle[$indice]['DevolucionDetalle']['impuesto'] = $valor['FacturacionDetalle']['impuesto'];
                        }
                    }
                }

                if ($objDevDet->saveAll($devolucionDetalle)) {
                    $tienda = substr($this->Session->read('codigo_punto'), 1);
                    $res = $objDev->query("select fn_devolucion('$tienda', {$objDev->id}, {$this->Session->read('punto_id')}, {$this->Interfaz->id($this->Session->read('usuario_id'))}) as res");
                    $resultado = explode('|', $res[0][0]['res']);
                    if ($resultado[0] == 'true') {
                        if ($conServicios > 0) {
                            $idOriginal = $objDev->id;
                            $numOriginal = $resultado[1];
                            $devolucionServicio = array();
                            $devolucionServicio['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
                            $devolucionServicio['cliente_id'] = $this->Interfaz->id($this->request->data['id2']);
                            $devolucionServicio['usuario_id'] = $this->Interfaz->id($this->Session->read('usuario_id'));
                            $devolucionServicio['punto_id'] = $this->Session->read('punto_id');
                            $devolucionServicio['factura_id'] = $idFle;
                            $devolucionServicio['numero'] = '001';
                            $devolucionServicio['observacion'] = $this->Interfaz->mayuscula($observacion);
                            $devolucionServicio['fecha'] = 'now()';
                            $devolucionServicio['monto'] = $totalServicios;
                            $devolucionServicio['tipdev'] = 'F';
                            $devolucionServicio['padre_id'] = $idOriginal;
                            if ($objDev->saveAll($devolucionServicio)) {
                                $con = 0;
                                foreach ($detalleServicios as $indice => $valor) {
                                    $detalleServicios[$con]['DevolucionDetalle']['devolucion_id'] = $objDev->id;
                                    $con++;
                                }
                                if ($objDevDet->saveAll($detalleServicios)) {
                                    $res = $objDev->query("select fn_devolucion('$tienda', {$objDev->id}, {$this->Session->read('punto_id')}, {$this->Interfaz->id($this->Session->read('usuario_id'))}) as res");
                                    $resultado = explode('|', $res[0][0]['res']);
                                    if ($resultado[0] == 'true') {
                                        $objDev->query('COMMIT');
                                        echo "1_{$idOriginal}_{$numOriginal}";
                                    } else {
                                        $objDev->query('ROLLBACK');
                                        echo "2_{$resultado[1]}";
                                    }
                                } else {
                                    $objDev->query('ROLLBACK');
                                    echo "2_";
                                }
                            } else {
                                $objDev->query('ROLLBACK');
                                echo "2_";
                            }
                        } else {
                            $objDev->query('COMMIT');
                            echo "1_{$objDev->id}_{$resultado[1]}";
                        }
                    } else {
                        $objDev->query('ROLLBACK');
                        echo "2_{$resultado[1]}";
                    }
                }
            } else {
                $objDev->query('ROLLBACK');
                echo "2_";
            }
            $this->autoRender = false;
        }
    }

}
